#include <stdio.h>
#define MAX_LEN 1001
#define mid(x, y) (((x) + (y)) / 2)
#define N tree[pnode]
#define NL tree[pnode * 2]
#define NR tree[pnode * 2 + 1]

typedef char bool_;

typedef struct node
{
    int L, R;
    int sum;
    int dirty_sum;
    int dirty_mul;
} node;

node tree[MAX_LEN];
int data[MAX_LEN];

void make_tree(int L, int R, int pnode)
{
    N.L = L;
    N.R = R;
    N.dirty_sum = 0;
    N.dirty_mul = 1;
    if (L == R - 1)
    {
        N.sum = data[L];
        return;
    }
    make_tree(L, mid(L, R), pnode * 2);
    make_tree(mid(L, R), R, pnode * 2 + 1);
    N.sum = NL.sum + NR.sum;
}

int get_sum(int L, int R, int pnode)
{
    if (N.R <= L || N.L >= R)
        return 0;
    if (L <= N.L && N.R <= R)
    {
        return N.sum;
    }
    return get_sum(L, R, pnode * 2) + get_sum(L, R, pnode * 2 + 1);
}

void set_add(int L, int R, int val, int pnode)
{
    if (N.R <= L || N.L >= R)
        return;
    if (L <= N.L && N.R <= R)
    {
        N.sum += val;
        N.dirty_sum += val;
        return;
    }
    // purify
    set_add(L, R, val + N.dirty_sum, pnode * 2);
    set_add(L, R, val + N.dirty_sum, pnode * 2 + 1);
    N.sum *= N.dirty_mul;
    N.dirty_mul = 1;
    N.sum += N.dirty_sum * (N.R - N.L);
    N.dirty_sum = 0;
}

void set_mul(int L, int R, int val, int pnode)
{
    if (N.R <= L || N.L >= R)
        return;
    if (L <= N.L && N.R <= R)
    {
        N.sum *= val;
        N.dirty_mul *= val;
        return;
    }
    // purify
    set_mul(L, R, val + N.dirty_mul, pnode * 2);
    set_mul(L, R, val + N.dirty_mul, pnode * 2 + 1);
    N.sum *= N.dirty_mul;
    N.dirty_mul = 1;
    N.sum += N.dirty_sum * (N.R - N.L);
    N.dirty_sum = 0;
}

int main()
{
    for (int i = 0; i < 8; ++i)
        data[i] = i;
    make_tree(0, 8, 1);
    set_add(2, 7, 1, 1);
    int sum = get_sum(3, 5, 1);
    printf("%d\n", sum);
}